package framework.ui;

import org.client.otdr.TableData;
import org.openems.entity.Entity;
import org.openems.entity.Key;
import org.openems.entity.TableEntity;

import framework.DomainService;
import framework.EntityStoreListener;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.layout.Pane;
import javafx.util.Callback;

public class EmsTable extends Pane {

	private TableView<TableData> tableView;

	public EmsTable(Key key, DomainService service) {
		service.addEntityStoreListener(new EntityStoreListener() {
			@Override
			public void valueChanged(Entity entity) {
				updateTable((TableEntity)entity);
			}
		}, key);

		tableView = new TableView<TableData>();
		tableView.setPrefSize(600, 200);
		this.getChildren().add(tableView);
	}

	protected void updateTable(TableEntity entity) {
		
		tableView.getItems().clear();
		
		ObservableList<TableData> data = FXCollections.observableArrayList();
		
		if (isTitleChanged(entity)) {
			tableView.getColumns().clear();
			for (int col = 0; col < entity.getColumnCount(); col++) {
				final Integer j = col;
				TableColumn tableColumn = new TableColumn(entity.getTitle()[j]);
				tableColumn.setCellValueFactory(new Callback<CellDataFeatures<TableData,String>,ObservableValue<String>>(){
					public ObservableValue<String> call(CellDataFeatures<TableData, String> param) {
						return new SimpleStringProperty(param.getValue().get(j).toString());
					}
				});  
				tableView.getColumns().add(tableColumn);
			}
		}
		
		this.tableView.getItems().clear();
		for (String s[] : entity.getRowDataList()) {
			data.add(new TableData(s));
		}
		tableView.setItems(data);
	}

	private boolean isTitleChanged(TableEntity entity) {
		return this.tableView.getColumns().size() != entity.getColumnCount();
	}
}
